/******************************************************************
 * 作者：sipeiliu
 * 邮箱：sipeiliu@163.com
 * 描述：超声波传感器，测量距离
 * 日期：2023.4.17
 ******************************************************************/

#include "/opt/sighter/inc/ultrasonic.h"

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <wiringPi.h>
#include <sys/time.h>

const int sound_velocity = 340000; // 音速，单位mm/s
const int wpi_trig = 9;           // 触发器使用13号引脚
const int wpi_echo = 10;           // 接收器使用15号引脚

static int ret;      // 函数返回值
int global_distance; // 全局变量，距离，mm

/*设置超声波传感器使用的引脚*/
static void ultrasonic_gpio(void)
{
    wiringPiSetup();           // 初始化wiringpi
    pinMode(wpi_trig, OUTPUT); // 触发器配置为输出模式
    pinMode(wpi_echo, INPUT);  // 接收器配置为输入模式
    pullUpDnControl(wpi_echo, PUD_DOWN);
}

/*使能触发器*/
static void enable_trig(void)
{
    digitalWrite(wpi_trig, 1); // IO触发测距
    delayMicroseconds(20);     // 至少给10us高电平信号
    digitalWrite(wpi_trig, 0); // 关闭触发器
}

/*监听接收器*/
static int listen_echo(void)
{
    struct timeval tval;     // 当前时间
    long long int this_time; // 本次时间点
    long long int last_time; // 上次时间点
    int interval_time;       // 间隔时间

    while (1) // 捕获开始时间
    {
        ret = digitalRead(wpi_echo); // 读电平
        if (ret == 1)
        {
            gettimeofday(&tval, NULL);                                 // 获取当前时间
            last_time = (tval.tv_sec * 1000000 + tval.tv_usec) / 1000; // ms
            // printf("last_time %lld\n", last_time);
            break;
        }
    }
    while (1) // 捕获结束时间
    {
        ret = digitalRead(wpi_echo); // 读电平
        if (ret == 0)
        {
            gettimeofday(&tval, NULL);                                 // 获取当前时间
            this_time = (tval.tv_sec * 1000000 + tval.tv_usec) / 1000; // ms
            // printf("this_time %lld\n", this_time);
            break;
        }
    }

    interval_time = this_time - last_time;
    return interval_time;
}

/*使能超声波传感器*/
void enable_ultrasonic(void)
{
    int interval_time; // 时间
    while (1)
    {
        ultrasonic_gpio();             // 设置超声波传感器gpio
        enable_trig();                 // 使能触发器
        interval_time = listen_echo(); // 监听接收器
        // printf("%d ms\n", interval_time);
        global_distance = sound_velocity * interval_time / 20000; // mm
        // printf("%d mm\n", global_distance);
    }
}

// void main(void)
// {
//     enable_ultrasonic();
// }